package com.java.lang.reflect;


import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import org.junit.Test;

public class ReflectionTest {

    @Test
    public void testReflect() {
        Student s = new Student();

        Class<? extends Student> clazz = s.getClass();
        System.out.println(clazz); // class com.java.lang.reflect.Student

        // getSuperclass()获得该类的父类
        Class<?> superClass = clazz.getSuperclass();
        System.out.println(superClass);// class com.java.lang.reflect.Person

        /**
         * 1) Type 是java 编程语言中的所有类型的父接口。这些包括原始类型、参数化类型、数组类型、类型变量。 <br>
         * 
         * 2) Class 是 Type 的唯一实现类 Class.getGenericSuperclass():
         * 返回代表当前实体(类、接口、简单类型或void)的父类的类型(获得带有泛型的父类)<br>
         */
        Type type = clazz.getGenericSuperclass();
        System.out.println(type); // com.java.lang.reflect.Person<com.java.lang.reflect.Student>

        // parameterizedtype 是Type的 子接口,代表一个参数化的类型
        ParameterizedType p = (ParameterizedType) type;

        // getActualTypeArguments():返回表示该类型的 实际类型参数的 类型 的数组
        Class<?> c = (Class<?>) p.getActualTypeArguments()[0];
        System.out.println(c); // class com.java.lang.reflect.Student
    }
}
